package com.sanshengshui.netty.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

/**
 * 这段代码是一个 Netty 服务器的初始化器（ChannelInitializer），用于配置新连接的通道（SocketChannel）。让我们一步步解释这段代码：
 * 继承 ChannelInitializer<SocketChannel>：这个类继承了 ChannelInitializer 并指定了泛型参数为 SocketChannel，表明它用于初始化处理 Socket 连接的通道。
 */
public class ServerInitializer extends ChannelInitializer<SocketChannel> {
    //定义静态的解码器、编码器和业务处理器：
    //StringDecoder 用于将字节数据解码为字符串。
    //StringEncoder 用于将字符串编码为字节数据。
    //ServerHandler 是自定义的业务逻辑处理器。这个处理器需要根据实际的需求来实现，它会处理从客户端接收到的消息。
    private static final StringDecoder DECODER = new StringDecoder();
    private static final StringEncoder ENCODER = new StringEncoder();

    private static final ServerHandler SERVER_HANDLER = new ServerHandler();

    /**
     * ChannelPipeline 是一个处理事件和数据的责任链。通过它，可以将各种处理器按顺序添加到处理链中。
     * DelimiterBasedFrameDecoder 是一个解码器，用于防止粘包现象。它根据指定的分隔符对接收到的数据进行切割。
     * DECODER 和 ENCODER 负责将字节数据解码和编码为字符串。
     * SERVER_HANDLER 是业务逻辑的处理器，处理从客户端接收到的消息。
     *
     * @param ch
     * @throws Exception
     */
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        // 添加帧限定符来防止粘包现象
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        // 解码和编码，应和客户端一致
        pipeline.addLast(DECODER);
        pipeline.addLast(ENCODER);

        // 业务逻辑实现类
        pipeline.addLast(SERVER_HANDLER);
    }
}
/**
 * 总体而言，这个初始化器配置了一个通道处理流水线，以处理从客户端接收到的数据。这通常涉及到解码、编码和业务逻辑处理。需要注意的是，实际的业务逻辑在 ServerHandler 类中实现。
 */

